package com.wn.common.widget

import androidx.core.view.get
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.google.android.material.bottomnavigation.BottomNavigationView

/**
 * @Author: wn
 * @Date: 2022/12/20 16:55
 * @Description: BottomNavigation 点击事件和 Viewpager2滑动事件绑定，实现同步
 * BottomNavigationView + fragment 首页 就是 tabLayout+ viewPager 首页内 滑动  底部无需关联 fragment 滑动
 * BottomNavigationView + ViewPager2 + adaptor 底部 关联 ViewPager2滑动  首页部分 tabLayout 可以需要 处理 滑动嵌套关系
 */
class BottomNavVP2Mediator(
  private val bn: BottomNavigationView,
  private val vp: ViewPager2,
  private val lifecycle: Lifecycle,
  private val config: ((BottomNavigationView, ViewPager2) -> Unit)? = null
) : DefaultLifecycleObserver {
  // 容器 map  存放  MenuItem  通过  MenuItem 获取 Int--index
//  private val map = mutableMapOf<MenuItem, Int>()

  // 初始化 map
/*  init {
    bn.menu.forEachIndexed { index, item ->
      map[item] = index
    }
  }*/

  private val pageSelectedCallback = object : OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
      super.onPageSelected(position)
      // 切换界面的时候，将 bn 对应的itemId赋给 selectedItemId 然后改变 bn 位置 -- @+id/homeFragment"
      bn.selectedItemId = bn.menu[position].itemId
    }
  }

  // bn 附加 关联 vp
  fun attach() {
//    添加 Lifecycle  观察者 Activity 中
    lifecycle.addObserver(this)

    config?.invoke(bn, vp)

//    ViewPager2 滑动页面
    vp.registerOnPageChangeCallback(pageSelectedCallback)

//    BottomNavigationView  点击底部  响应到ViewPager2上
//    setOnNavigationItemSelectedListener
    bn.setOnItemSelectedListener {
      // menu文件夹中 bottom_nav_menu.xml里加的 android:orderInCategory 属性就是下面item.getOrder()取的值
      vp.currentItem = it.order
//      vp.currentItem = map[it] ?: error("Bnv的item的ID${it.itemId}没有对应的viewpage2元素}")
      true
    }
  }

  override fun onDestroy(owner: LifecycleOwner) {
    super.onDestroy(owner)
    vp.unregisterOnPageChangeCallback(pageSelectedCallback)
  }
}